﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using System.Data;
using MySql.Data.Types;

namespace br.com.nrtech.ccb.bot.bll
{
    public static class daoIgreja
    {
        public static void gravaIgreja(moIgreja igreja)
        {
            if (igreja == null) return;
            if (igrejaExiste(igreja) > -1) return;

            Conexao.conectar();

            MySqlCommand comando = new MySqlCommand("INSERT INTO igreja (dtCad,dtAlt,versao,central,pais,uf,"
                + "cep,bairro,referencia,endereco,diasCulto,rjm,telefone,tsda,maisInfo,cidade, emReforma, dataAbertura, localProvisorio, diasCultoReforma, ativa, ensaiosMusicais) VALUES ("
                + @"@dtCad,@dtAlt,@versao,@central,@pais,@uf,@cep,@bairro,@referencia,@endereco,"
                + @"@diasCulto,@rjm,@telefone,@tsda,@maisInfo,@cidade, @emReforma, @dataAbertura, @localProvisorio, @diasCultoReforma, @ativa, @ensaiosMusicais)"
            );          

            comando.Connection = Conexao.mConn;
            comando.Parameters.AddWithValue("@dtCad", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            comando.Parameters.AddWithValue("@dtAlt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            comando.Parameters.AddWithValue("@versao", igreja.versao);
            comando.Parameters.AddWithValue("@central", igreja.central.ToString());
            comando.Parameters.AddWithValue("@pais", igreja.pais);
            comando.Parameters.AddWithValue("@uf", igreja.uf);
            comando.Parameters.AddWithValue("@cep", igreja.cep);
            comando.Parameters.AddWithValue("@bairro", igreja.bairro);
            comando.Parameters.AddWithValue("@referencia", igreja.referencia == null ? "" : igreja.referencia);
            comando.Parameters.AddWithValue("@endereco", igreja.endereco);
            comando.Parameters.AddWithValue("@diasCulto", igreja.diasCulto);
            comando.Parameters.AddWithValue("@rjm", igreja.rjm.ToString());
            comando.Parameters.AddWithValue("@telefone", "");
            comando.Parameters.AddWithValue("@tsda", igreja.tsda.ToString());
            comando.Parameters.AddWithValue("@maisInfo", "");
            comando.Parameters.AddWithValue("@cidade", igreja.cidade);

            comando.Parameters.AddWithValue("@emReforma", igreja.emReforma.ToString());
            comando.Parameters.AddWithValue("@dataAbertura", igreja.dataAbertura.ToString("yyyy-MM-dd HH:mm:ss"));
            comando.Parameters.AddWithValue("@localProvisorio", igreja.localProvisorio);
            comando.Parameters.AddWithValue("@diasCultoReforma", igreja.diasCultoProv);
            comando.Parameters.AddWithValue("@ativa", igreja.ativa.ToString());
            comando.Parameters.AddWithValue("@ensaiosMusicais", igreja.ensaiosMusicais);

            comando.ExecuteNonQuery();
        }

        public static void apagarIgreja(int id)
        {
            Conexao.conectar();
            MySqlCommand comando = new MySqlCommand("DELETE FROM igreja WHERE id = @id");

            comando.Connection = Conexao.mConn;
            comando.Parameters.AddWithValue("@id", id);

            comando.ExecuteNonQuery();
        }

        public static int atualizaIgreja(moIgreja igreja)
        {
            Conexao.conectar();

            MySqlCommand comando = new MySqlCommand("UPDATE igreja SET "+
                " dtAlt = @dtAlt,"+
                " versao = @versao, "+
                " cidade = @cidade, " +
                " central = @central, " +
                " pais = @pais, " +
                " uf = @uf, " +
                " cep = @cep, " +
                " bairro = @bairro, " +
                " bairro = @bairro, " +
                " referencia = @ref, " +
                " endereco = @end, " +
                " telefone = @tel, " +
                " maisInfo = @mais, " +
                " tsda = @tsda, "+
                " emReforma = @emReforma, " +
                " dataAbertura = @dataAbertura, " +
                " localProvisorio = @localProvisorio, " +
                " diasCultoReforma = @diasCultoReforma, " +
                " ativa = @ativa, " +
                " ensaiosMusicais = @ensaiosMusicais " +     
                " WHERE id = @id");

            comando.Connection = Conexao.mConn;
            comando.Parameters.AddWithValue("@dtAlt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            comando.Parameters.AddWithValue("@versao", igreja.versao);
            comando.Parameters.AddWithValue("@central", igreja.central.ToString());
            comando.Parameters.AddWithValue("@pais", igreja.pais);
            comando.Parameters.AddWithValue("@uf", igreja.uf);
            comando.Parameters.AddWithValue("@cep", igreja.cep);
            comando.Parameters.AddWithValue("@bairro", igreja.bairro);
            comando.Parameters.AddWithValue("@ref", igreja.referencia == null ? "" : igreja.referencia);
            comando.Parameters.AddWithValue("@end", igreja.endereco);
            comando.Parameters.AddWithValue("@tel", igreja.telefone);
            comando.Parameters.AddWithValue("@tsda", igreja.tsda.ToString());
            comando.Parameters.AddWithValue("@mais", igreja.maisInfo);
            comando.Parameters.AddWithValue("@cidade", igreja.cidade);
            comando.Parameters.AddWithValue("@id", igreja.id);

            comando.Parameters.AddWithValue("@emReforma", igreja.emReforma.ToString());
            comando.Parameters.AddWithValue("@dataAbertura", igreja.dataAbertura.ToString("yyyy-MM-dd HH:mm:ss"));
            comando.Parameters.AddWithValue("@localProvisorio", igreja.localProvisorio);
            comando.Parameters.AddWithValue("@diasCultoReforma", igreja.diasCultoProv);
            comando.Parameters.AddWithValue("@ativa", igreja.ativa.ToString());
            comando.Parameters.AddWithValue("@ensaiosMusicais", igreja.ensaiosMusicais);

            return comando.ExecuteNonQuery();
        }

        public static void atualizaTSDA(int id, bool tdsa)
        {
            Conexao.conectar();

            MySqlCommand comando = new MySqlCommand("UPDATE igreja SET tsda = @tsda WHERE id = @id");
            comando.Connection = Conexao.mConn;
            comando.Parameters.AddWithValue("@tsda", tdsa.ToString());
            comando.Parameters.AddWithValue("@id", id);

            comando.ExecuteNonQuery();
        }

        public static Int32 igrejaExiste(moIgreja igreja)
        {
            try
            {
                if (igreja == null) return -1;
                Conexao.conectar();

                MySqlCommand comando = new MySqlCommand("SELECT * FROM igreja WHERE cep = @cep AND endereco = @endereco", Conexao.mConn);
                comando.Parameters.AddWithValue("@cep", igreja.cep);
                comando.Parameters.AddWithValue("@endereco", igreja.endereco);
                MySqlDataReader resultado = comando.ExecuteReader();
                if (resultado.HasRows)
                {
                    resultado.Read();
                    return resultado.GetInt32("id");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return -1;
        }

        public static moIgreja getIgreja(Int32 id)
        {
            moIgreja retorno = new moIgreja();
            try
            {
                if (id == null) return null;
                Conexao.conectar();

                MySqlCommand comando = new MySqlCommand("SELECT * FROM igreja WHERE id = @id", Conexao.mConn);
                comando.Parameters.AddWithValue("@id", id);
                MySqlDataReader resultado = comando.ExecuteReader();

                DateTime menorData = DateTime.Now;

                if (resultado.HasRows)
                {
                    resultado.Read();
                    retorno.id = resultado.GetInt32("id");
                    retorno.bairro = resultado.GetString("bairro");
                    retorno.central = resultado.GetBoolean("central");
                    retorno.cep = resultado.GetString("cep");
                    retorno.cidade = resultado.GetString("cidade");
                    retorno.diasCulto = resultado.GetString("diasCulto");
                    retorno.dtAlt = resultado.GetDateTime("dtAlt");
                    retorno.dtCad = resultado.GetDateTime("dtCad");
                    retorno.endereco = resultado.GetString("endereco");
                    retorno.maisInfo = resultado.GetString("maisInfo");
                    retorno.pais = resultado.GetString("pais");
                    retorno.referencia = resultado.GetString("referencia");
                    retorno.rjm = resultado.GetString("rjm");
                    retorno.telefone = resultado.GetString("telefone");
                    retorno.tsda = resultado.GetBoolean("tsda");
                    retorno.uf = resultado.GetString("uf");
                    retorno.versao = resultado.GetString("versao");

                    retorno.emReforma = resultado["emReforma"] != DBNull.Value ? resultado.GetBoolean("emReforma") : false;
                    retorno.dataAbertura = (resultado["dataAbertura"] != DBNull.Value ? resultado.GetDateTime("dataAbertura") : menorData);

                    if (retorno.dataAbertura.Equals(DateTime.MinValue))
                        retorno.dataAbertura = DateTime.Now;

                    retorno.localProvisorio =  resultado["localProvisorio"] != DBNull.Value ? resultado.GetString("localProvisorio") : "";
                    retorno.diasCultoProv =  resultado["diasCultoReforma"] != DBNull.Value ? resultado.GetString("diasCultoReforma") : "";
                    retorno.ativa = resultado["ativa"] != DBNull.Value ? resultado.GetBoolean("ativa") : false;
                    retorno.ensaiosMusicais =  resultado["ensaiosMusicais"] != DBNull.Value ? resultado.GetString("ensaiosMusicais") : "";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retorno;
        }

        public static MySqlDataAdapter listarPaises()
        {
            MySqlDataAdapter retorno;
            Conexao.conectar();
            MySqlCommand comando = new MySqlCommand(
                @"SELECT DISTINCT pais FROM igreja ORDER BY pais",
                Conexao.mConn);

            retorno = new MySqlDataAdapter(comando);
            return retorno;
        }

        public static MySqlDataAdapter listarUFs(String pais)
        {
            MySqlDataAdapter retorno;
            Conexao.conectar();
            MySqlCommand comando = new MySqlCommand(
                "SELECT DISTINCT uf FROM igreja WHERE pais = \"" + pais + "\" ORDER BY pais",
                Conexao.mConn);

            retorno = new MySqlDataAdapter(comando);
            return retorno;
        }

        public static MySqlDataAdapter listarIgrejas(moIgreja igrejaFiltro)
        {
            MySqlDataAdapter retorno;
            Conexao.conectar();
            MySqlCommand comando = new MySqlCommand(
                "SELECT pais as \"Pais\", uf as UF, cidade as Cidade, endereco as \"Endereco\", id as ID, dtCad as Cadastro, versao as \"Versao\", central as Central,  " +
                  "cep as CEP, bairro as Bairro, referencia as \"Ponto de Ref.\", diasCulto as \"Dias de Culto\","+
                  "rjm as RJM, telefone as Telefone, tsda as \"T.S.D.A.\" FROM igreja WHERE 1 = 1" +
                  (igrejaFiltro.id == 0 ? "" : " AND id = " + igrejaFiltro.id.ToString()) +
                (igrejaFiltro.bairro == null ? "" : " AND bairro LIKE \"%" + igrejaFiltro.bairro + "%\"") +
                (!igrejaFiltro.central ? "" : " AND central = \"True\"") +
                (igrejaFiltro.cep == null ? "" : " AND cep LIKE \"%" + igrejaFiltro.cep + "%\"") +
                (igrejaFiltro.cidade == null ? "" : " AND cidade LIKE \"%" + igrejaFiltro.cidade + "%\"") +
                (igrejaFiltro.diasCulto == null ? "" : " AND diasCulto LIKE \"%" + igrejaFiltro.diasCulto + "%\"") +
                (igrejaFiltro.endereco == null ? "" : " AND endereco LIKE \"%" + igrejaFiltro.endereco + "%\"") +
                (igrejaFiltro.pais == null ? "" : " AND pais LIKE \"%" + igrejaFiltro.pais + "%\"") +
                (igrejaFiltro.rjm == null ? "" : " AND rjm LIKE \"%" + igrejaFiltro.rjm + "%\"") +
                (igrejaFiltro.telefone == null ? "" : " AND telefone LIKE \"%" + igrejaFiltro.telefone + "%\"") +
                (igrejaFiltro.uf == null ? "" : " AND uf LIKE \"%" + igrejaFiltro.uf + "%\"") +
                (!igrejaFiltro.tsda ? "" : " AND tsda LIKE \"%" + igrejaFiltro.tsda.ToString() + "%\"")
                +" ORDER BY pais, uf, cidade, endereco", Conexao.mConn);

            retorno = new MySqlDataAdapter(comando);
            return retorno;
        }
    }
}
